import book.Book;
import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User:张熳
 * Date:2025-09-04
 * Time:16:56
 */

/**
 * 图书管理系统
 * 用户：管理员、普通用户
 * 书：许多书、书架
 * 操作（操作的是书架）：管理员（增加、删除、查找、显示图书、退出等）、普通用户（查找、借阅、归还、退出等）
 */

public class Main {
    public static User login() {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入你的姓名：");
        String name = scanner.nextLine();

        System.out.print("请输入你的身份-1.管理员👩 2.普通用户🙋：");
        int choice = scanner.nextInt();
        if (choice == 1) {
            return new AdminUser(name);//如果是1，创建管理员对象，如果是2，创建普通用户对象
        }else {
            return new NormalUser(name);
        }
    }
    public static void main(String[] args) {
        BookList bookList = new BookList();

        User user = login();
        while (true) {
            int choice = user.menu();
            //要根据这个返回值来看调用 哪个对象 的 哪个方法
            /**
             * 1.哪个对象
             *  已经做了：User user = login();
             * 2.哪个方法
             *  2.1 确定当前对象已经包含了这些方法
             *   我们需要将这些方法写在抽象类父类User里面，因为当前的对象向上转型了，只能调用父类中有的方法：
             *   我们将这些方法(ioperations包中的方法)写成一个数组，需要调用哪个方法就调用数组中的哪一个元素
             *   而这个数组通过子类进行初始化，再调用子类对象的时候，构造方法会初始化好对应的操作对象
             *  2.2 怎么具体调用
             *   我们写的对象数组是使用封装思想的，即使用protected修饰，只能在同包中或者不同包的子类中使用
             *   可以在父类中创建一个方公共法，提供使用封装方法的途径
             */
            user.doIoperation(choice,bookList);
        }
    }
}
